<?php defined('BASEPATH') OR exit('No direct script access allowed');

class SSH{
	protected $CI;
	public $ip;
	public $user;
	public $pass;
	public $port;
	public $connection;
    public function __construct()
    {
		$this->CI =& get_instance();
    }
	/**
		自定义初始化方法，任何操作前先init
		$auth 为数组 用于传入 连接授权信息
	**/
	public function init($auth){
		$this->CI->load->helper('array');
		$this->ip = element("ip",$auth);
		$this->user = element("user",$auth,"root");
		$this->pass = element("pass",$auth,"alpine");
		$this->port = element("port",$auth,"22");
		if($this->scanPort($this->ip,$this->port)){
			$this->connection = ssh2_connect($this->ip,$this->port);
			if (ssh2_auth_password($this->connection,$this->user,$this->pass))  
			{
				return "1";		// 连接成功
			}else{
				return "2";		// 用户名或者密码错误
			}
		}else{
			return "3";			// 端口未开放
		}
	}
	/**
		exec_Ret 通过ssh2执行远程shell命令
		$shell 需要远程执行的命令 string
		$res 执行结果的返回值 连接失败返回 False
	**/
	public function exec_Ret($shell){
		$stream = ssh2_exec($this->connection, $shell);
		stream_set_blocking($stream,true);
		$res = stream_get_contents($stream);
		return $res;
	}
	
	public function exec($shell){
		ssh2_exec($this->connection, $shell);
	}
	/**
		后台执行 适合执行时间较长的任务 会将执行结果保存在日志文件中
		$shell 需要远程执行的命令 string
		返回执行的日志文件路径
	**/
	public function exec_nohup($shell){
		$logfilePath = "/var/root/CloudFlat_logs/".random_string('alnum', 16)."-".time().".log";//生成一个随机的日志文件路径 后面跟上时间
		$this->exec_Ret("nohup {$shell} > {$logfilePath} 2>&1");
		return $logfilePath;
	}
	/**
		从远程服务器下载一个文件到本地
		$remotePath 远程文件路径
		$localPath 本地文件路径
	**/
	public function getFile($remotePath,$localPath){
		ssh2_scp_recv($this->connection, $remotePath, $localPath);
		if(file_exists($localPath)){
			return TRUE;
		}else{
			return FALSE;
		}
	}
	/**
		从本地发送一个文件到远程服务器
		$localPath 本地文件路径
		$remotePath 远程文件路径
		如果远程路径不存在 也不会创建目录
		如果远程路径存在 则覆盖重写
	**/
	public function sendFile($localPath,$remotePath,$code){
		if(ssh2_scp_send($this->connection,$localPath,$remotePath,$code)){
			return TRUE;
		}else{
			return FALSE;
		}
	}
	/**
		确认deb包是否安装
	**/
	public function debExists($debName){
		$res = $this->exec_Ret("dpkg -l");
		if(strpos($res, $debName)){
			return TRUE;
		}else{
			return FALSE;
		}
	}
	/**
		远程下载
		$url 为下载地址
		$remotePath 为远程保存路径
		无返回值
	**/
	public function rWget($url,$remotePath){
		$this->exec_Ret("wget -P {$remotePath} {$url}");
	}
	/**
		远程安装应用
		$RipaPath 为ipa文件路径(设备的本地路径)
		返回安装的日志文件路径
	**/
	public function ipaInstall($RipaPath){
		return $this->exec_nohup("ipainstaller {$RipaPath}");
	}
	/**
		删除远程文件
		$RfilePath 远程文件路径
		无返回值
	**/
	public function delFile($RfilePath){
		$this->exec_Ret("rm -rf {$RfilePath}");
	}
	/**
		读取远程文件的内容
		$RfilePath 远程文件路径
		返回读取内容
	**/
	public function catFile($RfilePath){
		return $this->exec_Ret("cat {$RfilePath}");
	}
	/**
		deb文件安装
		$RfilePath 远程文件路径
		无返回值
	**/
	public function debInstall($RfilePath){
		return $this->exec_nohup("dpkg -i {$RfilePath}");
	}
	/**
		重启远程设备
		无返回值
	**/
	public function reboot(){
		// $this->exec_Ret("reboot");
		ssh2_exec($this->connection,"reboot");
	}
	
	/**
		获取脚本列表
		返回脚本列表
	**/
	public function getScriptList(){
		$res = $this->exec_Ret("ls /var/touchelf/scripts -m");
		$arr = explode(",",$res);
		return $arr;
	}
	/**
		扫描指定IP端口是否开放
		$ip 设备IP
		$port 端口
		$timeout 最长等待时间 单位秒
		返回 bool
	**/
	public function scanPort($ip,$port=22,$timeout=0.5){
		$conn = @fsockopen($ip, $port, $errno, $errstr, $timeout);
		if ($conn) {
			fclose($conn);
			return TRUE;
 		}else{
			return FALSE;
		}
	}
}